Imports Softelvdm.SftTreeNET
Imports Softelvdm.Controls
Imports System.Reflection

Public Class Form1

Private Sub CloseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton.Click
    Close()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SftTree1.Initializing = True
    SftTree1.AllowDrop = True
    SftTree1.AutoExpandDragDrop = True
    SftTree1.Columns.Count = 2
    SftTree1.Headers(0, 0).Text = "Left Tree Control"
    For c As Integer = 1 To SftTree1.Columns.Count - 1
        SftTree1.Headers(0, c).Text = "Column " + c.ToString()
    Next
    For i As Integer = 0 To 100 - 1
        Dim itemParent As ItemClass = SftTree1.ItemCollection.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        itemParent.RowHeader.Text = i.ToString()
        i = i + 1
        Dim item As ItemClass = itemParent.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        item.RowHeader.Text = i.ToString()
        i = i + 1
        Dim subitem As ItemClass = item.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        subitem.RowHeader.Text = i.ToString()
        i = i + 1
        Dim child As ItemClass = subitem.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        child.RowHeader.Text = i.ToString()
        i = i + 1
        child = item.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        child.RowHeader.Text = i.ToString()
    Next
    SftTree1.Columns.MakeOptimal(0, False)
    SftTree1.RowHeaders.MakeOptimal(0, False)
    SftTree1.RecalcHorizontalExtent()
    SftTree1.Initializing = False

    SftTree2.Initializing = True
    SftTree2.AllowDrop = True
    SftTree2.AutoExpandDragDrop = True
    SftTree2.Columns.Count = 3
    SftTree2.RowHeaders.Width = 0
    SftTree2.Headers(0, 0).Text = "Right Tree Control"
    For c As Integer = 1 To SftTree2.Columns.Count - 1
        SftTree2.Headers(0, c).Text = "Column " + c.ToString()
    Next
    For i As Integer = 0 To 100 - 1
        Dim itemParent As ItemClass = SftTree2.ItemCollection.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        itemParent.RowHeader.Text = i.ToString()
        i = i + 1
        Dim item As ItemClass = itemParent.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        item.RowHeader.Text = i.ToString()
        i = i + 1
        Dim subitem As ItemClass = item.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        subitem.RowHeader.Text = i.ToString()
        i = i + 1
        Dim child As ItemClass = subitem.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        child.RowHeader.Text = i.ToString()
        i = i + 1
        child = item.Add(New String() {"Item " + i.ToString(), "Cell 1 in Item " + i.ToString(), "Cell 2 in Item " + i.ToString()})
        child.RowHeader.Text = i.ToString()
    Next
    SftTree2.Columns.MakeOptimal(0, False)
    SftTree2.RecalcHorizontalExtent()
    SftTree2.Initializing = False
End Sub

Private Sub sftTree1_DragDetected(ByVal sender As System.Object, ByVal e As Softelvdm.SftTreeNET.DragDetectedEventArgs) Handles SftTree1.DragDetected
    Debug.Write("sftTree1_DragDetected ")
    DumpValues(e)
    ' get the current item
    If e.Item Is Nothing Then Return
    Dim item As ItemClass = e.Item
    ' don't drag headers, footers
    If item.UsageLocation <> UsageLocationEnum.items Then Return
    ' start dragging the item
    SftTree1.DoDragDrop(e.Item, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub

Private Sub sftTree1_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles SftTree1.DragOver
    Debug.WriteLine("sftTree1_DragOver ")
    e.Effect = DragDropEffects.None
    If Not SftTree1.DropTarget Is Nothing And e.Data.GetDataPresent(GetType(ItemClass)) Then
        ' Copy or move based on control key
        If ((Control.ModifierKeys And Keys.Control) <> 0) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.Move
        End If
    End If
End Sub

Private Sub sftTree1_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles SftTree1.DragDrop
    Debug.Write("sftTree1_DragDrop ")
    DumpValues(e)
    If Not SftTree1.DropTarget Is Nothing And e.Data.GetDataPresent(GetType(ItemClass)) Then
        Dim originalItem As ItemClass = e.Data.GetData(GetType(ItemClass))
        Dim targetItem As ItemClass = SftTree1.DropTarget
        Dim newItem As ItemClass = Nothing
        If e.Effect = DragDropEffects.Move Then
            Try
                newItem = originalItem.Move(targetItem, MoveStyleEnum.TargetAsParentInsertFirst)
            Catch exc As Exception
                MessageBox.Show(exc.Message)
            End Try
        Else
            Try
                newItem = originalItem.Copy(targetItem, CopyStyleEnum.TargetAsParentInsertFirst, True)
            Catch exc As Exception
                MessageBox.Show(exc.Message)
            End Try
        End If
        If Not newItem Is Nothing Then
            SftTree1.Columns.MakeOptimal(0, False)
            newItem.ScrollIntoView()
        End If
    End If
End Sub

Private Sub sftTree2_DragDetected(ByVal sender As System.Object, ByVal e As Softelvdm.SftTreeNET.DragDetectedEventArgs) Handles SftTree2.DragDetected
    Debug.Write("sftTree2_DragDetected ")
    DumpValues(e)
    ' get the current item
    If e.Item Is Nothing Then Return
    Dim item As ItemClass = e.Item
    ' don't drag headers, footers
    If item.UsageLocation <> UsageLocationEnum.items Then Return
    ' start dragging the item
    SftTree2.DoDragDrop(e.Item, DragDropEffects.Copy Or DragDropEffects.Move)
End Sub

Private Sub sftTree2_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles SftTree2.DragOver
    Debug.WriteLine("sftTree2_DragOver ")
    e.Effect = DragDropEffects.None
    If Not SftTree2.DropTarget Is Nothing And e.Data.GetDataPresent(GetType(ItemClass)) Then
        ' Copy or move based on control key
        If ((Control.ModifierKeys And Keys.Control) <> 0) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.Move
        End If
    End If
End Sub

Private Sub sftTree2_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles SftTree2.DragDrop
    Debug.Write("sftTree2_DragDrop ")
    DumpValues(e)
    If Not SftTree2.DropTarget Is Nothing And e.Data.GetDataPresent(GetType(ItemClass)) Then
        Dim originalItem As ItemClass = e.Data.GetData(GetType(ItemClass))
        Dim targetItem As ItemClass = SftTree2.DropTarget
        Dim newItem As ItemClass = Nothing
        If e.Effect = DragDropEffects.Move Then
            Try
                newItem = originalItem.Move(targetItem, MoveStyleEnum.TargetAsParentInsertFirst)
            Catch exc As Exception
                MessageBox.Show(exc.Message)
            End Try
        Else
            Try
                newItem = originalItem.Copy(targetItem, CopyStyleEnum.TargetAsParentInsertFirst, True)
            Catch exc As Exception
                MessageBox.Show(exc.Message)
            End Try
        End If
        If Not newItem Is Nothing Then
            SftTree2.Columns.MakeOptimal(0, False)
            newItem.ScrollIntoView()
        End If
    End If
End Sub

' This is a small helper routine to show all properties and fields of an object
Private Sub DumpValues(ByVal o As Object)
    Dim api() As PropertyInfo = o.GetType().GetProperties()
    For Each pi As PropertyInfo In api
        Dim ov = pi.GetValue(o, New Object() {})
        Dim s As String = " " & pi.Name
        If Not ov Is Nothing Then s = s + " " + ov.ToString()
        Debug.Write(s)
    Next
    Dim afi() As FieldInfo = o.GetType().GetFields()
    For Each fi As FieldInfo In afi
        Dim ov = fi.GetValue(o)
        Dim s As String = " " & fi.Name
        If Not ov Is Nothing Then s = s + " " + ov.ToString()
        Debug.Write(s)
    Next
    Debug.WriteLine("")
End Sub

End Class